#pragma once
#include "src/TGPoint.h"
#include "src/TGLine.h"

class TGPolygon {
public:
    std::vector<TGPoint> data;
    void init();
    double getArea();
    TGPoint getCenter();
    void add(const TGPoint&);
    bool isContainPoint(const TGPoint&) const; //多边形是否包含某一点
    TGPolygon& operator = (const TGPolygon&);
};

//利用atan2完成极角排序
void polarAngleSortWithAtan2(TGPolygon& polygon);
//利用叉积完成极角排序
void polarAngleSortWithCross(TGPolygon& polygon);

//获取多边形第n条边，逆时针方向
void getEdge(const TGPolygon& polygon, int n, TGLine& line);
//将多边形1和2的交点放入多边形3中
void getIntersectionPoints(TGPolygon& polygon1, TGPolygon& polygon2, TGPolygon& polygon3); 
//将多边形1和2的交点以及互相包含的点放入多边形3中
void getAllIntersectionPoints(TGPolygon& polygon1, TGPolygon& polygon2, TGPolygon& polygon3);
//将多边形的顶点按逆时针排序并去重
void antiClockwiseAndRemoveDuplicate(TGPolygon&);

// Sutherland–Hodgman algorithm(逐边裁剪算法) 使用clip去裁剪src
void SHClip(TGPolygon& src, TGPolygon& clip, TGPolygon& dst);
// 单步裁剪，使用边l裁剪多边形src
void clipStep(const TGPolygon& src, const TGLine& l, TGPolygon& dst);

//Graham扫描法寻找点集中的凸包
//如果该点集存在凸包返回ture并将结果以逆时针顺序存入polygon
//如果不存在凸包则返回false
bool findConvexHullWithGraham(std::vector<TGPoint>& points, TGPolygon& polyon);

//求解两个凸包的闵可夫斯基和
std::vector<TGPoint> mincowskySum(const TGPolygon& polygon1, const TGPolygon& polygon2);
